package poi;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import java.util.HashMap;
import java.util.Map;

/**
 * @author kai
 */
public class WordTitleParse {

    /**
     * 每个类型和它的解析类
     *
     * @return
     */
    public static Map<WordTitleEnum, IDocumentParse> wordTitleParseTool() {
        Map<WordTitleEnum, IDocumentParse> map = new HashMap<>(5);
        map.put(WordTitleEnum.ServiceProtection, serviceProtection());
        map.put(WordTitleEnum.Itinerary, itinerary());
        map.put(WordTitleEnum.Accommodation, accommodation());
        return map;
    }

    public static IDocumentParse<ServiceProtect> serviceProtection() {
        ParseDocx2ServiceProtect parser = ParseDocx2ServiceProtect.getInstance();
        // 分别为：栏目 姓名 职位 电话

        // 2022 版
//        instance.setRegex("(([\\u4e00-\\u9fa5\\u0020\\u3000]{2,30})：)?(([\\u4e00-\\u9fa5\\u0020\\u3000]+[\\u4e00-\\u9fa5])[\\s|\\u3000]+)?([\\u4e00-\\u9fa5]+)?[\\s|\\u3000]*(\\d{3}-\\d{8}|\\d{4}-\\d{7,8}|[1][0-9]{10})");
//        instance.setAllPosition(2, 4, 5, 6);

        // 2021 版
        parser.setRegex("(([\\u4e00-\\u9fa5\\u0020\\u3000]{2,30})：)?(.*)(\\d{3}-\\d{8}|\\d{4}-\\d{7,8}|[1][0-9]{10})[\\s|\\u3000]*([\\(（](.*)[\\)）])?");
        parser.setAllPosition(2, 3, 6, 4);
        return parser;
    }

    public static IDocumentParse<Itinerary> itinerary() {
        /**
         * 行程安排 的 正则 1：
         * *元组 1 x月x日
         *  其他元组都是辅助，暂时都用不到
         * -------------------
         * 行程安排 的 正则 2
         *  元组 1 (上午 或者 下午)的？
         * *元组 2 上午 或者 下午
         * *元组 3 时间 18:00 上下午和时间通过冒号进行分割，中间不能添加空格
         *  元组 4 小时 辅助用不到
         * *元组 5 活动
         */
//        instance = ItineraryParseUtils2022.getInstance();
//        instance.setRegex("(([0-9]|1[0-2])月(0?[0-9]|[1-2][0-9]|3[01])日).*",
//                "(?=.*[:：])(([上下]午)[:：])?((0?[0-9]|1[0-9]|2[0-3])[:：][0-5][0-9])?[\s|\u3000]*([\u4e00-\u9fa5、，。]{2,})");
//        // 1 用于第一个 pattern; 2, 3, 5 用于第二个 pattern
//        // 分别为：日期 上下午 时间 活动
//        instance.setAllPosition(1, 2, 3, 5);

        ParseDocx2Itinerary2021 parser = ParseDocx2Itinerary2021.getInstance();
        parser.setRegex("(([0-9]|1[0-2])月(0?[0-9]|[1-2][0-9]|3[01])日).*(上午|下午)",
                "(?=.*[:：])((0?[0-9]|1[0-9]|2[0-3])[:：][0-5][0-9])?[\\s|\\u3000]*(.{2,})");
        // 1 用于第一个 pattern; 2, 3, 5 用于第二个 pattern
        // 分别为：日期 上下午 时间 活动
        parser.setAllPosition(1, 4, 1, 3);
        return parser;
    }

    public static IDocumentParse<Accommodation> accommodation() {
        ParseDocxTable2Accommodation parser = ParseDocxTable2Accommodation.getInstance();
        // 分别为：姓名 职位 房间号 车次号
        parser.setAllPosition(0, 1, 2, 3);
        return parser;
    }

    /**
     * 只有 XWPFParagraph 类型需要临时变量
     *
     * @return
     */
    public static Map<WordTitleEnum, TempScanData> wordTitleTempData(final Map<WordTitleEnum, IDocumentParse> wordTitleEnumMap) {
        final Map<WordTitleEnum, TempScanData> map = new HashMap<>(5);
        for (final Map.Entry<WordTitleEnum, IDocumentParse> it : wordTitleEnumMap.entrySet()) {
            if (it.getKey().getType() == XWPFParagraph.class) {
                map.put(it.getKey(), new TempScanData());
            }
        }
        return map;
    }

}
